#pragma once

#include <mysql_driver.h>
#include <mysql_connection.h>
#include <cppconn/exception.h>
#include <queue>
#include <mutex>
#include <memory>
#include <condition_variable>
#include <chrono>

using namespace std;
using namespace sql;


/**
 * @brief MySQL数据库连接池类（单例模式）
 * 
 * 通过复用数据库连接减少TCP握手和连接认证开销，提高高并发场景下的数据库访问性能。
 * 线程安全，支持动态扩容和空闲连接回收。
 */
class ConnectionPool
{
private:
	/* data */
	// 单例模式 私有构造
	ConnectionPool() = default;

	bool isValid() const;

	/**
     * @brief 创建新连接
     * @return 新创建的数据库连接指针
     */
	Connection* creatConnection();
	/**
     * @brief 验证连接是否有效
     * @param conn 待验证的连接指针
     * @return true表示连接有效，false表示无效
     */
	bool validateConnection(Connection* conn);
	
	// 连接存储队列（FIFO）  队列中存储 连接
	queue<Connection*> connQueue_;
	mutable mutex mutex_;
	condition_variable cond_;
    string host_, user_, pwd_, dbName_;
    unsigned int port_;
    int maxConn_;
    int curConn_ = 0;
    int connTimeout_;
    Driver* driver_;

public:
	/**
     * @brief 获取连接池单例实例（线程安全）
     * @return ConnectionPool* 单例指针
     */
 	static ConnectionPool* getInstance();

	void init(const string& host, const string& user, const string& pwd, const string& dbname, unsigned int port = 3306, int maxConn = 10, int timeout = 5000);

	/**
     * @brief 获取数据库连接（智能指针管理）
     * @param timeout 等待超时时间（默认3000ms）
     * @return shared_ptr<Connection> 数据库连接智能指针
     * @note 当连接超出最大空闲时间会被自动回收
     */
	shared_ptr<Connection> getConnection(int timeout = 3000);

	struct PoolStats
	{
		int total;
		int idle;
	};
	PoolStats getStats() const;

	// 析构时释放所有连接
	~ConnectionPool();	

	// 禁止拷贝和赋值 构造
	ConnectionPool(const ConnectionPool&) = delete;	
	ConnectionPool& operator=(const ConnectionPool&) = delete;	
	// 运算符重载声明
	bool operator!() const;
};


